package com.tham.dao;

import java.io.IOException;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import oracle.jdbc.OracleTypes;
import utiles.AppProperties;
import utiles.ConexionPool;

import com.tham.dto.ProfesionalDTO;
import com.tham.dto.EspecialidadDTO;
import com.tham.dto.PrestacionDTO;
import com.tham.vo.ProfesionalInsVO;
import com.tham.dto.CantHoraDTO;
import com.tham.vo.ProfesionalVO;

public class ProfesionalDAO {
	private static Logger log = Logger.getLogger(ProfesionalDAO.class);
	String pkgVar = (AppProperties.getProperty("aplicacion", "PACKAGE"));

	//sede, area, "", ""
	//sede, area, "cita", "dd/mm/yyyy" prfesional o equipos que tenga hora abierta esa fecha	
	public List<ProfesionalDTO> getProfesionalCmb(String sede, String area, String tipo, String vId) throws SQLException, IOException{
		//ConexionPool connDao = new ConexionPool();
		Connection conn = ConexionPool.getConnectionPool();	
		//Connection conn = ((javax.sql.PooledConnection)ConexionPool.getConnectionPool()).getConnection();


		List<ProfesionalDTO> listProfesionales = new ArrayList<ProfesionalDTO>();
		try {
			String query = "{ call "+pkgVar+".Pkg_tho_profesional.getProfesionalCmb(?,?,?,?,?) }"; 	       
			CallableStatement  stmt = conn.prepareCall(query);
			stmt.setString(1, sede);
			stmt.setString(2, area);
			stmt.setString(3, tipo);
			stmt.setString(4, vId);
			stmt.registerOutParameter(5, OracleTypes.CURSOR);
			stmt.execute();
			ResultSet rs = (ResultSet)stmt.getObject(5);

			while (rs.next()) {
				ProfesionalDTO profDTO = new ProfesionalDTO();
				profDTO.setIdProfesional(rs.getString(1));
				profDTO.setStrNombre(rs.getString(2));
				profDTO.setDescripcionPrest(rs.getString(3));
				profDTO.setHoraDisponible(rs.getString(4));
				listProfesionales.add(profDTO);
			}
			rs.close();
			stmt.close();
		} catch (SQLException ex) {  
			log.error("Error ProfesionalDAO.getProfesionalCmb SQLException: " +ex.getMessage());
			System.out.println(ex.getMessage());
		} finally {
			//ConexionPool.desconectaPool(conn);
			conn.close();
			conn = null;
		}
		return listProfesionales;

	}	

	public  List<ProfesionalDTO> getAllPorfesionales(ProfesionalVO profesionalVO) throws SQLException, IOException{
		Connection conn = ConexionPool.getConnectionPool();			    
		List<ProfesionalDTO> listProfesional = new ArrayList<ProfesionalDTO>();
		
		try {
			String query = "{ call "+pkgVar+".PKG_THO_PROFESIONAL.getAllProfesionales(?,?,?,?,?,?,?,?) }"; 	       
			CallableStatement  stmt = conn.prepareCall(query);
			stmt.setString(1, profesionalVO.getNomRut());
			stmt.setString(2, profesionalVO.getActivo());
			stmt.setString(3, profesionalVO.getBecado());
			stmt.setString(4, profesionalVO.getEspecialidad());
			stmt.setString(5, profesionalVO.getPrestacion());
			stmt.setString(6, profesionalVO.getIdSede());
			stmt.setString(7, profesionalVO.getIdArea());
			stmt.registerOutParameter(8, OracleTypes.CURSOR);

			stmt.execute();
			ResultSet rs = (ResultSet)stmt.getObject(8);
			while (rs.next()) {
				ProfesionalDTO profDTO = new ProfesionalDTO();
				profDTO.setIdProfesional(rs.getString(1));
				profDTO.setStrNombre(rs.getString(2));	
				profDTO.setStrApellidoPat(rs.getString(3));
				profDTO.setStrApellidoMat(rs.getString(4));
				profDTO.setIdPrestacion(rs.getString(5));
				profDTO.setDescripcionPrest(rs.getString(6));
				profDTO.setRut(rs.getString(7));
				profDTO.setDv(rs.getString(8));
				profDTO.setHoraDisponible("14/10/2010 15:30");	
				profDTO.setActivo(rs.getString(9));
				profDTO.setBecado(rs.getString(10));
				//profDTO.setr.setRutCompleto(rs.getString(11));
				listProfesional.add(profDTO);
			}
			rs.close();
			stmt.close();
		} catch (SQLException ex) {  
			log.error("Error ProfesionalDAO.getAllPorfesionales SQLException: " +ex.getMessage());
			System.out.println(ex.getMessage());
		} finally {
			conn.close();
			conn = null;
		}
		return listProfesional;
	}


	public List<EspecialidadDTO> getEspecialidad(String sede, String area, String tipo, String vId) throws SQLException, IOException{
		//ConexionPool connDao = new ConexionPool();
		Connection conn = ConexionPool.getConnectionPool();	
		//Connection conn = ((javax.sql.PooledConnection)ConexionPool.getConnectionPool()).getConnection();


		List<EspecialidadDTO> listEspecialidad = new ArrayList<EspecialidadDTO>();
		try {
			String query = "{ call "+pkgVar+".Pkg_tho_profesional.getEspecialidad(?,?,?,?,?) }"; 	       
			CallableStatement  stmt = conn.prepareCall(query);
			stmt.setString(1, sede);
			stmt.setString(2, area);
			stmt.setString(3, tipo);
			stmt.setString(4, vId);
			//System.out.println("Fecha:"+vId);
			stmt.registerOutParameter(5, OracleTypes.CURSOR);
			stmt.execute();
			ResultSet rs = (ResultSet)stmt.getObject(5);

			while (rs.next()) {
				EspecialidadDTO espDTO = new EspecialidadDTO();
				espDTO.setIdEspecialidad(rs.getString(1));
				espDTO.setDescripcion(rs.getString(2));	
				listEspecialidad.add(espDTO);
			}
			rs.close();
			stmt.close();
		} catch (SQLException ex) {  
			log.error("Error ProfesionalDAO.getEspecialidad SQLException: " +ex.getMessage());
			System.out.println(ex.getMessage());
		} finally {
			//ConexionPool.desconectaPool(conn);
			conn.close();
			conn = null;
		}
		return listEspecialidad;

	}	

	//id sede, id area, "espe", IDespcialidad" filtro por especialidad
	//id sede, id area, "", ""                 todas las prestaciones del area y sede
	//     "", id area, "", ""                 todas las prestaciones del area
	public List<PrestacionDTO> getPrestacion(String sede, String area, String tipo, String vId) throws SQLException, IOException{
		//ConexionPool connDao = new ConexionPool();
		Connection conn = ConexionPool.getConnectionPool();	
		//Connection conn = ((javax.sql.PooledConnection)ConexionPool.getConnectionPool()).getConnection();


		List<PrestacionDTO> listPrest = new ArrayList<PrestacionDTO>();
		try {
			String query = "{ call "+pkgVar+".Pkg_tho_profesional.getPrestacion(?,?,?,?,?) }"; 	       
			CallableStatement  stmt = conn.prepareCall(query);
			stmt.setString(1, sede);
			stmt.setString(2, area);
			stmt.setString(3, tipo);
			stmt.setString(4, vId);
			//System.out.println("Fecha:"+vId);
			stmt.registerOutParameter(5, OracleTypes.CURSOR);
			stmt.execute();
			ResultSet rs = (ResultSet)stmt.getObject(5);

			while (rs.next()) {
				PrestacionDTO prestDTO = new PrestacionDTO();
				prestDTO.setIdPrestacion(rs.getString(1));
				prestDTO.setDescripcion(rs.getString(2));	
				listPrest.add(prestDTO);
			}
			rs.close();
			stmt.close();
		} catch (SQLException ex) {  
			log.error("Error ProfesionalDAO.getPrestacion SQLException: " +ex.getMessage());
			System.out.println(ex.getMessage());
		} finally {
			//ConexionPool.desconectaPool(conn);
			conn.close();
			conn = null;
		}
		return listPrest;
	}	

	public  List<CantHoraDTO> getCantHoras(String idProf) throws SQLException, IOException{
		Connection conn = ConexionPool.getConnectionPool();			    
		List<CantHoraDTO> listProfesional = new ArrayList<CantHoraDTO>();
		try {
			String query = "{ call "+pkgVar+".PKG_THO_PROFESIONAL.getCantHoras(?,?) }"; 	       
			CallableStatement  stmt = conn.prepareCall(query);
			stmt.setString(1, idProf);
			stmt.registerOutParameter(2, OracleTypes.CURSOR);

			stmt.execute();
			ResultSet rs = (ResultSet)stmt.getObject(2);

			while (rs.next()) {
				CantHoraDTO profDTO = new CantHoraDTO();
				profDTO.setHoraNuevo(rs.getString(1));
				profDTO.setHoraControl(rs.getString(2));	
				profDTO.setHoraReevaluacion(rs.getString(3));
				profDTO.setHoraEurap(rs.getString(4));
				listProfesional.add(profDTO);
			}
			rs.close();
			stmt.close();
		} catch (SQLException ex) {  
			log.error("Error ProfesionalDAO.getCantHoras SQLException: " +ex.getMessage());
			System.out.println(ex.getMessage());
		} finally {
			conn.close();
			conn = null;
		}
		return listProfesional;
	}

	//getCantHoras


	public List<ProfesionalDTO> setInsertProfesional(ProfesionalInsVO profesionalInsVO) throws SQLException, IOException{

		ArrayList<ProfesionalDTO> listRetorno = new ArrayList<ProfesionalDTO>();
		int idMovimiento = 0;
		int idEstado     = 0;	
		Connection conn = ConexionPool.getConnectionPool();

		try {
			String query = "{ call "+pkgVar+".Pkg_tho_profesional.setInsertProfesional(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) }";				
			CallableStatement  stmt = conn.prepareCall(query);
			stmt.setString(1, profesionalInsVO.getIdProfesional());
			stmt.setString(2, profesionalInsVO.getIdPrestacion());
			stmt.setString(3, profesionalInsVO.getNombre());
			stmt.setString(4, profesionalInsVO.getApellidoP());
			stmt.setString(5, profesionalInsVO.getApellidoM());
			stmt.setString(6, profesionalInsVO.getFechaNac());
			stmt.setString(7, profesionalInsVO.getRut());
			stmt.setString(8, profesionalInsVO.getDigitoRut());
			stmt.setString(9, profesionalInsVO.getCorreoElectronico());
			stmt.setString(10, profesionalInsVO.getBecado());
			stmt.setString(11, profesionalInsVO.getHorasNuevoPAC());
			stmt.setString(12, profesionalInsVO.getHorasReevalPAC());
			stmt.setString(13, profesionalInsVO.getHorasControl());
			stmt.setString(14, profesionalInsVO.getActivo());
			stmt.setString(15, profesionalInsVO.getHorasEurap());
			stmt.registerOutParameter(16, OracleTypes.INTEGER);
			stmt.registerOutParameter(17, OracleTypes.INTEGER);
			stmt.execute();
			ProfesionalDTO profDTO = new ProfesionalDTO();
			idMovimiento = (stmt.getInt(16)); 		
			profDTO.setIdProfesional(String.valueOf(idMovimiento));
			idEstado    =  (stmt.getInt(17));
			profDTO.setIdProfesional(String.valueOf(idEstado));
			if (stmt.getInt(16)==11)			
				System.out.println("Medico no grabado, codigo de retorno:"+idEstado+" rut:"+idMovimiento);
			if (stmt.getInt(16)==21)
				System.out.println("Medico no grabado, codigo de retorno:"+idEstado+" IDM:"+idMovimiento);
			listRetorno.add(profDTO);
			stmt.close();
		} catch (SQLException ex) {  
			log.error("Error Pkg_tho_profesionales.setInsertProfesional SQLException: " +ex.getMessage());
			System.out.println(ex.getMessage());				
		} finally {
			conn.close();
			conn = null;
			log.info("Cambios en profesional, codigo de retorno:"+idEstado+" ID Medico:"+idMovimiento );						
		}						

		return listRetorno;
	}


	public  List<ProfesionalDTO> getProfById(String id) throws SQLException, IOException{
		Connection conn = ConexionPool.getConnectionPool();
			    
		List<ProfesionalDTO> listProfesional = new ArrayList<ProfesionalDTO>();
		try {
			String query = "{ call "+pkgVar+".Pkg_tho_profesional.getProfById(?,?) }"; 	       
			CallableStatement  stmt = conn.prepareCall(query);
			stmt.setString(1, id);
			stmt.registerOutParameter(2, OracleTypes.CURSOR);
			stmt.execute();
			ResultSet rs = (ResultSet)stmt.getObject(2);

			while (rs.next()) {
				ProfesionalDTO profDTO = new ProfesionalDTO();
				profDTO = new ProfesionalDTO();
				profDTO.setIdProfesional(rs.getString(1));
				profDTO.setStrNombre(rs.getString(2));	
				profDTO.setStrApellidoPat(rs.getString(3));
				profDTO.setStrApellidoMat(rs.getString(4));
				profDTO.setIdPrestacion(rs.getString(5));
				profDTO.setFecNac(rs.getString(6));
				profDTO.setCorreo(rs.getString(7));
				profDTO.setActivo(rs.getString(8));
				profDTO.setBecado(rs.getString(9));
				profDTO.setHrNuevoPAC(rs.getString(10));
				profDTO.setHrReev(rs.getString(11));
				profDTO.setHrCtrlPAC(rs.getString(12));
				profDTO.setHrEurap(rs.getString(13));
				profDTO.setRut(rs.getString(14));
				profDTO.setDv(rs.getString(15));
				listProfesional.add(profDTO);
			}
			rs.close();
			stmt.close();
		} catch (SQLException ex) {  
			log.error("Error ProfesionalDAO.getProfByRUT SQLException: " +ex.getMessage());
			System.out.println(ex.getMessage());
		} finally {
			conn.close();
			conn = null;
		}
		return listProfesional;
	} 


}
